package com.backend.springboot_project_demo.config;

import com.alibaba.fastjson.parser.ParserConfig;
import com.alibaba.fastjson.util.TypeUtils;
import com.backend.springboot_project_demo.utils.FastJsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.security.core.authority.SimpleGrantedAuthority;

@Configuration
public class RedisConfig {

  @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
      RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
      template.setConnectionFactory(factory);

//      // Json序列化配置
//      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//      ObjectMapper om = new ObjectMapper();
//      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//      jackson2JsonRedisSerializer.setObjectMapper(om);
//      StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//
//      // key采用String的序列化方式
//      template.setKeySerializer(stringRedisSerializer);
//      // hash的key也采用String的序列化方式
//      template.setHashKeySerializer(stringRedisSerializer);
//      // value序列化方式采用jackson
//      template.setValueSerializer(jackson2JsonRedisSerializer);
//      // hash的value序列化方式采用jackson
//      template.setHashValueSerializer(jackson2JsonRedisSerializer);

      FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class);

      // 使用StringRedisSerializer来序列化和反序列化redis的key值
      template.setKeySerializer(new StringRedisSerializer());
      template.setValueSerializer(serializer);

      // Hash的key也采用StringRedisSerializer的序列化方式
      template.setHashKeySerializer(new StringRedisSerializer());
      template.setHashValueSerializer(serializer);

      template.afterPropertiesSet();

      // 全局开启AutoType，这里方便开发，使用全局的方式
      ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
      // 建议使用这种方式，小范围指定白名单
      // ParserConfig.getGlobalInstance().addAccept("me.zhengjie.domain");
      ParserConfig.getGlobalInstance().addAccept("org.springframework.security.core.authority.");
      TypeUtils.addMapping("org.springframework.security.core.authority.SimpleGrantedAuthority", SimpleGrantedAuthority.class);

      return template;
  }
}